package net.livingflow.service;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

import javax.jdo.PersistenceManager;
import javax.jdo.Query;

/**
 * 通用的数据访问基类，用于对各种类型的对象实现增删改查操作
 * 
 * @author xueqiang.mi
 * @since 2010-11-27
 */
public abstract class BaseService {

	/**
	 * 删除操作
	 * 
	 * @param <T>
	 * @param clazz
	 *          要删除的数据的类型
	 * @param id
	 *          要删除的数据对象的id
	 */
	public <T> void delete(Class<T> clazz, Object id) {
		PersistenceManager pm = PMF.get();
		try {
			T obj = pm.getObjectById(clazz, id);
			if (obj != null) {
				pm.deletePersistent(obj);
			}
		} finally {
			pm.close();
		}
	}

	/**
	 * 查询操作
	 * 
	 * @param <T>
	 * @param clazz
	 *          要查询的数据的类型
	 * @param id
	 *          要查询的数据对象的id
	 * @return
	 */
	public <T> T get(Class<T> clazz, Object id) {
		PersistenceManager pm = PMF.get();
		try {
			return pm.getObjectById(clazz, id);
		} finally {
			pm.close();
		}
	}

	/**
	 * 查询操作，查询出所有对象
	 * 
	 * @param <T>
	 * @param clazz
	 * @return
	 */
	@SuppressWarnings("unchecked")
	protected <T> List<T> list(Class<T> clazz) {
		PersistenceManager pm = PMF.get();
		try {
			Query q = pm.newQuery(clazz);
			Collection<T> c = pm.detachCopyAll((Collection<T>) q.execute());
			return new ArrayList<T>(c);
		} finally {
			pm.close();
		}
	}

	/**
	 * 保存操作
	 * 
	 * @param obj
	 *          要保存的数据对象
	 */
	protected void save(Object obj) {
		PersistenceManager pm = PMF.get();
		try {
			pm.makePersistent(obj);
		} finally {
			pm.close();
		}
	}
}
